/* 
1 页面加载的时候
    1 从缓存中获取购物车数据 渲染到页面中
      这些数据中的checked属性都为true，即 checked=true
2 微信支付
  1 哪些人 哪些帐号 可以实现微信支付
    1 企业帐号 
    2 企业帐号的小程序后台中 必须 给开发者 添加上白名单 
      1 一个 appid 可以同时绑定多个开发者
      2 这些开发者就可以公用这个appid 和 它的开发权限  
3 支付按钮
  1 先判断缓存中有没有token
  2 没有 跳转到授权页面 进行获取token 
  3 有token 。。。
  4 创建订单 获取订单编号
  5 已经完成了微信支付 wx.requestPayment()
  6 手动删除缓存中 已经被选中了的商品 
  7 删除后的购物车数据 填充回缓存
  8 再跳转页面 
 */

/**
 * 1 导入授权地址文件
 * 2 导入解决报错的包
 */
import { getSetting, chooseAddress, openSetting, showModal, showToast, requestPayment } from "../../utils/asyncWx";
import regeneratorRuntime from '../../lib/runtime/runtime';
import { request } from "../../request/index";

Page({

  /**
   * 页面的初始数据
   */
  data: {
    address: {},
    cart: [],
    // 总价格
    totalPrice: 0,
    // 总数量
    totalNum: 0
  },
  onShow() {
    // 1 获取缓存中的收获地址信息
    const address = wx.getStorageSync("address");
    // 1 获取缓存中的购物车数据
    let cart = wx.getStorageSync("cart") || [];
    // 过滤后的购物车数组（支付时所有的商品checked=true）
    // cart.filter(v=>v.checked), filter过滤函数，过滤出所有checked=true的商品信息
    cart = cart.filter(v => v.checked);

    // 1总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      totalPrice += v.num * v.goods_price
      totalNum += v.num;
    });
    // 把购物车数据重新设置回data中
    this.setData({
      address,
      cart,
      totalPrice,
      totalNum,
    });
  },
  // 支付功能
  async handleOrderPay() {
    try {
      // 1 判断缓存中有没有token
      const token = wx.getStorageSync("token");
      // 2 判断
      if (!token) {
        wx.navigateTo({
          url: '/pages/auth/index'
        });
        return;
      }
      // 3 创建订单
      // 3.1 准备 请求头参数
      // const header = { Authorization: token };
      // 3.2 准备 请求体参数
      const order_price = this.data.totalPrice;
      const consignee_addr = this.data.address.all;
      const cart = this.data.cart;
      let goods = [];
      cart.forEach(v => goods.push({
        goods_id: v.goods_id,
        goods_number: v.num || 1,
        goods_price: v.goods_price
      }));
      const orderParams = { order_price, consignee_addr, goods };
      // 4 准备发送请求 创建订单 获取订单编号
      const { order_number } = await request({ url: "/my/orders/create", method: "POST", data: orderParams });
      // console.log("order_number: "+order_number);
      // 5 发起 预支付接口
      const { pay } = await request({ url: "/my/orders/req_unifiedorder", method: "POST", data: { order_number } });
      // console.log("pay: "+pay);
      // console.log(pay);
      // 6 发起微信支付
      await requestPayment(pay);
      // 7 查询后台 订单状态
      const res = await request({ url: "/my/orders/chkOrder", method: "POST", data: { order_number } });
      // console.log(res);
      await showToast({ title: "支付成功" });

      // 8 支付成功后：手动删除缓存中已经支付了的商品
      // 首先获取缓存中的cart数组，不能从this.data中拿，因为this.data是过滤之后的数据
      let newCart=wx.getStorageSync("cart");
      // 删除已经支付的商品，newCart.filter(v=>!v.checked)：过滤出newCart数组未被选中的商品
      newCart=newCart.filter(v=>!v.checked);
      // 更新缓存中的cart数组
      wx.setStorageSync("cart", newCart);
      // 9 支付成功了 跳转到订单页面
      wx.navigateTo({
        url: '/pages/order/index'
      });
    } catch (error) {
      await showToast({ title: "支付失败" });
      /*
        失败的原因：用的是别人的服务器，使用的是别人的token值，
        自己支付时的Appid和别人token值对应的Appid不一样，所以会报错：requestPayment:fail no permission
      */
      console.log(error);
    }
  },
  // 点击 收货地址
  async handleChooseAddress() {
    // 获取收获地址
    // wx.chooseAddress({
    //   success: (result) => {
    //     console.log(result);
    //   },
    //   fail: (result) => {
    //     console.log("获取地址失败");
    //   }
    // });

    // 1 获取 权限状态
    // wx.getSetting({
    //   success: (result) => {
    //     // 2 获取权限状态 主要发现一些 属性名很怪异的时候 都要使用[]形式来获取属性值
    //     const scopeAddress = result.authSetting["scope.address"];
    //     if(scopeAddress===true||scopeAddress===undefined){
    //       wx.chooseAddress({
    //         success: (result1) => {
    //           console.log(result1);
    //         },
    //         fail: (result2) => {
    //           console.log("获取地址失败1");
    //         }
    //       });  
    //     }
    //     else{
    //       // 3 用户 以前拒绝过授权 ， 现诱导用户打开授权页面
    //       wx.openSetting({
    //         success: (result3) => {
    //           console.log(result3);
    //         },
    //         fail: (result4) => {
    //           console.log(result4);
    //         }
    //       });

    //     }

    //   },
    //   fail: () => {},
    //   complete: () => {}
    // });

    try {
      // 1 获取 权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      // 2 判断 权限状态
      // if不会执行，因为最新的版本scope的值都为true，直接授权地址
      if (scopeAddress === false) {
        await openSetting();
      }
      // 4 调用获取收货地址的 api
      let address = await chooseAddress();
      //  console.log(address);
      // 在address对象中新添加一个all属性
      address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;

      // 5 存入到缓存中
      wx.setStorageSync("address", address);

    } catch (error) {
      console.log(error);
    }


  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  }
})